package require Tk

source gml_Object.tcl
source PAC.tcl
source SWL_FC.tcl
source monde.tcl
source joueur.tcl
source menujoueur.tcl



#------------------------------------------------------------------------------------------------------------------------------

#MainFrameA
#
#main_frame abstraction

inherit MainFrameA Abstraction
method MainFrameA constructor {control l} {
	
	this inherited $control 
	
	set this(noyau) [SWL_FC S]
	set this(lesJoueurs) [dict create]
	
	this ajoutJoueurs $l	

}

method MainFrameA ajoutJoueurs {liste} {
	
foreach j $liste {this ajoutJoueur $j}

puts [dict keys $this(lesJoueurs)]



}

method MainFrameA ajoutJoueur {joueur} {
	
 
puts "ajout d'un joueur"

set id_temp [$this(noyau) Add_new_player $joueur]
dict set this(lesJoueurs) $id_temp name $joueur

return $id_temp
	
}

method MainFrameA supprimerJoueur {idp} {

dict unset this(lesJoueurs) $idp
$this(noyau) Destroy_player $idp	
	
}

method MainFrameA getListe {} {
	
	return $this(lesJoueurs)

}


method MainFrameA getNoyau {} {

return $this(noyau)	
	
}
 

method MainFrameA play {} {

$this(noyau) Start_fire
		
}

method MainFrameA ajouter_vaisseau {idj x y radius} {
	
return [$this(noyau) Add_new_ship $idj $x $y $radius]
	
}

method MainFrameA supprimerVaisseau {idj idv} {

$this(noyau) Destroy_ship $idj $idv	
	
}

method MainFrameA destructor {} {
	
	
	destroy $this(noyau)
	
}


#MainFrameP
#on retrouve la fenêtre principale ainsi que le menu du haut
#main_frame presentation

inherit MainFrameP Presentation
method MainFrameP constructor {control} {
	this inherited $control
	
	set this(window) [toplevel .${objName} -width 800 -height 600]
	wm protocol $this(window) WM_DELETE_WINDOW "$this(control) dispose"
	#wm title $this(window) $control avoir pour le titre
	
	
	
	#MENU_DEBUT
	menu $this(window).menubar -type menubar
	
	$this(window).menubar add cascade -label Fichier -menu $this(window).menubar.fichier -underline 0
	$this(window).menubar add cascade -label Edition -menu $this(window).menubar.edition -underline 0
	$this(window).menubar add cascade -label Aide -menu $this(window).menubar.aide -underline 0
	
	#Fichier 
	menu $this(window).menubar.fichier -tearoff 0
	$this(window).menubar.fichier add command -label "Charger partie" -underline 0 -command {}
	$this(window).menubar.fichier add command -label "Ouvrir map" -underline 0 -command {}
    $this(window).menubar.fichier add command -label "Sauvegarder partie" -underline 0 -command {}
	$this(window).menubar.fichier add command -label "Quitter" -underline 0 -command {}

    
    #Edition
    menu $this(window).menubar.edition -tearoff 0
	$this(window).menubar.edition add command -label "Ajouter/Supprimer vaisseau" -command "$objName fenetreAjoutSupVaisseau"
	$this(window).menubar.edition add command -label "Ajouter/Supprimer planete" -underline 0 -command {}
	$this(window).menubar.edition add command -label "Ajouter/Supprimer joueur" -underline 0 -command { }
	
    
    #Help
    menu $this(window).menubar.aide -tearoff 0
	$this(window).menubar.aide add command -label "Aide" -underline 0 -command {}
	$this(window).menubar.aide add command -label "About" -underline 0 -command {}
    
    
	$this(window) configure -menu $this(window).menubar
	#MENU_FIN
	
	#SEPARATION WINDOW DEBUT
	
	wm geometry $this(window) 800x600

	panedwindow $this(window).pane -orient horizontal
	 
	pack $this(window).pane -side top -expand 1 -fill both
	
	set this(frame_carte) [frame $this(window).pane.right -bg yellow -width 500 -height 600]
	pack configure  $this(frame_carte) -fill both -expand 1

	
	panedwindow $this(window).pane.left -orient vertical
	pack $this(window).pane.left -side top -expand 1 -fill both
	
	set this(frame_minicarte) [frame $this(window).pane.left.minicarte -bg green -width 300 -height 300]
	set this(frame_menujoueur) [frame $this(window).pane.left.menujoueur -bg blue -width 300 -height 300]
	pack configure  $this(frame_minicarte) -side top -fill both -expand 1
	pack configure  $this(frame_menujoueur) -side bottom -fill both -expand 1
	
	$this(window).pane add $this(window).pane.left $this(window).pane.right
	$this(window).pane.left add $this(window).pane.left.minicarte $this(window).pane.left.menujoueur
	
	
 	#SEPARATION WINDOW FIN
 	
 
}


method MainFrameP getFrameMenuJoueurP {} {

return $this(frame_menujoueur)
	
}

method MainFrameP getFrameCarte {} {

return $this(frame_carte)
	
}


method MainFrameP destructor {} {
   destroy $this(window)
}


#MainFrame
#
#main_frame Controler

inherit MainFrame Control
method MainFrame constructor {parent args} {
	

	set this(MainFrameA) [MainFrameA ${objName}_abst $objName $args]
	set this(MainFrameP) [MainFrameP ${objName}_pres $objName]
	
	set this(Monde) [ Monde ${objName}_monde $objName [$this(MainFrameP) getFrameCarte] ]
	
	
	
	set this(MenuJoueur) [ MenuJoueur ${objName}_menujoueur ${objName} [$this(MainFrameA) getListe] [$this(MainFrameP) getFrameMenuJoueurP]]
		
    this inherited $parent $this(MainFrameA) $this(MainFrameP) "$this(Monde) $this(MenuJoueur)"
        
    this test
 
}


method MainFrame getCanevas {} {

return [$this(Monde) getCanevas]	
	
}



method MainFrame test {} {
	
#set id_P1 [$S Add_new_player "toto"]
#set id_P2 [$S Add_new_player "Bob" ]
#set id_S1 [$S Add_new_ship $id_P1 300 200 10]; $S Update_ship $id_P1 $id_S1 [dict create fire_velocity 1 fire_angle 1]
#set id_S2 [$S Add_new_ship $id_P1 200 300 10]; $S Update_ship $id_P1 $id_S2 [dict create fire_velocity 10 fire_angle 1]
#set id_S3 [$S Add_new_ship $id_P2 500 200 10]; $S Update_ship $id_P2 $id_S3 [dict create fire_velocity 1 fire_angle 5]
#set id_S4 [$S Add_new_ship $id_P2 500 300 10]; $S Update_ship $id_P2 $id_S4 [dict create fire_velocity 10 fire_angle 5]

#set id_p1 [$S Add_new_planet 400 400 30 10]
#set id_p2 [$S Add_new_planet 400 300 20 5 ]	

this ajouterVaisseau "Player_1" 30 50 10
this ajouterVaisseau "Player_1" 150 150 10
this ajouterVaisseau "Player_1" 300 50 10
	
}



method MainFrame play {} {
	
$this(MainFrameA) play
	
}

method MainFrame getListeVaisseau {} {
	
return [$this(Monde) getListeVaisseau]	
	
}

method MainFrame getListeJoueurs {} {
	

return [$this(MainFrameA) getListe]	
	
}

method MainFrame getListeVaisseau_joueur {idj} {
	
return [$this(Monde) getListeVaisseau_joueur $idj]	
	
}


method MainFrame ajouterVaisseau {id_joueur x y radius} {
	
	set id_vaisseau_cree [$this(MainFrameA) ajouter_vaisseau $id_joueur $x $y $radius] 
	
	$this(Monde) ajouter_vaisseau $id_vaisseau_cree $id_joueur $x $y $radius "Alive"
		
}

method MainFrame supprimerVaisseau {idj idv} {
	

$this(MainFrameA) supprimerVaisseau $idj $idv
$this(Monde) supprimerVaisseau $idv
	
}
method MainFrame ajoutJoueur_dansNoyau {nom} {


return [$this(MainFrameA) ajoutJoueur $nom]	
	
	
}

method MainFrame supprimerJoueur {idp} {

	$this(MainFrameA) supprimerJoueur $idp
	$this(Monde) supprimerJoueur_sesvaisseaux $idp
	
}





#------------------------------------------------------------------------------------------------------------------------------


